package com.xing.binbackend.pattern.observer31;

/**
 * 阶段一：基础认知
     * 电商系统，当订单状态变为"已付款"时，哪些模块需要响应？这些响应动作之间是否应该解耦？
     * 如果采用硬编码方式调用库存服务、物流服务和通知服务，会存在什么维护问题？
     * 当需要新增一个数据分析服务监听订单事件，需要修改多少处代码？
 * 阶段二：案例实现 电商订单状态通知系统，当订单状态变化时，需要触发以下操作：
     * 库存服务：扣减库存
     * 物流服务：生成运单
     * 消息服务：发送短信/APP推送
     * 风控服务：检查异常订单
     * 分析服务：记录用户行为
 * 阶段三：深度思考问题
 *      * 观察者顺序问题：如果风控服务需要先于库存服务执行，如何保证观察者执行顺序？这种设计是否违反观察者模式的原则？
 *          观察者模式原生不保证执行顺序，但业务可能需要特定顺序（如风控先于库存）
 *          解决方案：1.通过注册顺序控制（维护有序列表） 2.增加优先级字段（如实现 Comparable 接口） 3.链式调用模式（类似责任链）
 *          原则性分析：未违反观察者模式原则（松散耦合特性仍然保留），属于业务场景的合理扩展
 *      * 异常处理机制：当某个观察者处理失败时，是否应该中断后续观察者的执行？如何设计重试机制？
 *          事务一致性与系统可用性的平衡
 *          熔断策略：核心服务（如库存）失败时中断流程，非核心服务（如通知）记录异常继续执行
 *          重试设计
 *              同步重试：立即重试（适合网络抖动）
 *              异步重试：进入重试队列（需幂等设计）
 *              死信队列：最终兜底方案
 *      * 性能优化：如果物流服务响应较慢，如何避免阻塞主流程？是否需要引入异步观察者？
 *          异步处理，典型场景：物流服务响应慢导致下单接口超时
 *           @Async 和 @EventListener
             注意事项：
             需要配置线程池防止资源耗尽
             配合消息队列实现削峰填谷
             异步场景需考虑最终一致性
 *      * 动态配置：如何实现运行时动态启用/禁用某个观察者（比如通过管理后台配置）？
 *          观察者实现 isEnabled() 方法
 *          配置中心存储开关状态（数据库/配置服务器）
 *          事件发布时过滤禁用观察者
 *      * 观察者生命周期：如果某个观察者服务是远程服务，如何处理网络不可用的情况？
 *           心跳检测机制（定期探活）
             超时控制（如 3s 超时）
             熔断降级（Hystrix/Sentinel）
             本地日志补偿（异常请求持久化+定时重试）
 *      * 事件过滤：如何让观察者只接收自己关心的事件类型（比如只处理支付成功事件）？
            精准订阅方案：
 *          // 基于事件类型的过滤
            public class PaymentSuccessObserver implements Observer {
                  @Override
                  public boolean supports(EventType type) {
                      return type == EventType.PAYMENT_SUCCESS;
                  }
            }
            // 发布事件时携带类型标识
            eventBus.publish(new Event(EventType.PAYMENT_SUCCESS, data));
 * 阶段四：模式对比思考
     * 观察者模式与发布-订阅模式有哪些核心区别？
     * 为什么Spring框架中的ApplicationEvent机制不直接使用观察者模式？
     * 在分布式系统中，如何将观察者模式扩展为事件溯源（Event Sourcing）架构？
 * 实战建议
     * 在现有代码基础上增加「订单取消」事件处理
     * 实现一个可配置的观察者管理系统（通过配置文件控制启用哪些观察者）
     * 尝试用Guava的EventBus实现相同功能，对比两种实现方式的差异
     * 需要我继续深入讲解某个环节吗？或是提供更具体的场景练习？
 */
public class Client {
    public static void main(String[] args) {
        OrderStatusManager manager = new OrderStatusManager();
        // 注册观察者
        manager.registerObserver(new InventoryService());
        manager.registerObserver(new RiskControlService());
        // 模拟订单状态变化
        Order order = new Order("123", "CREATED");
        manager.updateOrderStatus(order, "PAID");
    }
}
